<?php
// 订单模型
class PayService extends Service {
	
	/** 查询有效的支付 **/
	public function selectById($pay_id){
		$payinfo = model('Pay')->where(" id='{$pay_id}' ")->find();
		return $payinfo;
	}
	
	/**
	 * 默认查询，有效的、未被确认的（未与对应支付项确认）支付记录。
	 * @param unknown_type $item_id			对应订单ID或冲值纪录ID
	 * @param unknown_type $pay_type		支付类型（支付类型：对应数据字典-付款类型）
	 * @param unknown_type $enable			是否有效，也可叫做是否可用  取值：'Y' 'N'
	 * @param unknown_type $is_confirmed	是否已确认，也可叫做是否已被对应支付项认领  取值：'all' 'Y' 'N'
	 */
	public function selectItemPay($item_id,$pay_type,$enable,$is_confirmed){
		$map = $this->_selectPayinfoWhereSql(null,$item_id,$pay_type,null,$is_confirmed,$enable);
		$paylist = model('Pay')->where($map)->findAll();
		return $paylist;
	}
	
	/**
	 * 默认查询，有效的、未被确认的（未与对应支付项确认）支付记录。
	 * @param unknown_type $item_id			对应订单ID或冲值纪录ID
	 * @param unknown_type $pay_type		支付类型（支付类型：对应数据字典-付款类型）
	 * @param unknown_type $enable			是否有效，也可叫做是否可用
	 * @param unknown_type $is_confirmed	是否已确认，也可叫做是否已被对应支付项认领
	 */
	public function countItemPay($uid,$item_id,$pay_type,$pay_mode,$is_confirmed='all'){
		$map = $this->_selectPayinfoWhereSql($uid,$item_id,$pay_type,$pay_mode,$is_confirmed,'Y');
		$result =	model('Pay')->where($map)->limit(1)->field('sum(`total_fee`) as totalcredit')->find();
		$totalamount	=	$result['totalcredit'];
		return $totalamount;
	}
	
	public function countOrderPaiedAmount($item_id,$pay_type,$enable,$is_confirmed){
		/** 计算已支付仅额 **/
		$map = $this->_selectPayinfoWhereSql(null,$item_id,$pay_type,null,$is_confirmed,$enable);
		$result =	model('Pay')->where($map)->limit(1)->field('sum(`total_fee`) as totalcredit')->find();
		$_total_pay	=	$result['totalcredit'];
		Log::record('>>>>>支付结果:->service(Pay)->countOrderPaiedAmount()[订单：'.$item_id.']已支付总额：'.$_total_pay,Log::K_ORDER,Log::FILE);
		Log::save(); 
		return $_total_pay;
	}
	
	/**
	 * 计算订单用现金支付的总金额
	 */
	public function countOrderUseMoneyPaiedAmount($item_id,$pay_type){
		/** 计算已支付仅额 **/
		$map = $this->_selectPayinfoWhereSql(null,$item_id,$pay_type,null,'Y','Y');
		$map['service']	= array('in',array('alipay','tenpay','xxypay'));
		$result =	model('Pay')->where($map)->limit(1)->field('sum(`total_fee`) as totalcredit')->find();
		$_total_pay	=	$result['totalcredit'];
		return $_total_pay;
	}
	
	/**
	 * 默认查询，有效的、未被确认的（未与对应支付项确认）支付记录。
	 * @param unknown_type $item_id			对应订单ID或冲值纪录ID
	 * @param unknown_type $pay_type		支付类型（支付类型：对应数据字典-付款类型）
	 * @param unknown_type $pay_mode		支付模式（支付提供商）
	 * @param unknown_type $enable			是否有效，也可叫做是否可用  取值：'Y' 'N'
	 * @param unknown_type $is_confirmed	是否已确认，也可叫做是否已被对应支付项认领  取值：'all' 'Y' 'N'
	 */
	public function searchItemPay($uid,$item_id,$pay_type,$pay_mode,$limit=15,$enable,$is_confirmed,$trade_no=null){
		$map = $this->_selectPayinfoWhereSql($uid,$item_id,$pay_type,$pay_mode,$is_confirmed,$enable,$trade_no);
		$order='ctime desc';
		$pagedata = model('Pay')->kPageQuery($map,$order,$limit);
		//echo model('Pay')->getLastSql();
		return $pagedata;
	}
	
	/**
	 * 默认查询，有效的、未被确认的（未与对应支付项确认）支付记录。
	 * @param unknown_type $item_id			对应订单ID或冲值纪录ID
	 * @param unknown_type $pay_type		支付类型（支付类型：对应数据字典-付款类型）
	 * @param unknown_type $pay_mode		支付模式（支付提供商）
	 * @param unknown_type $enable			是否有效，也可叫做是否可用  取值：'Y' 'N'
	 * @param unknown_type $is_confirmed	是否已确认，也可叫做是否已被对应支付项认领  取值：'all' 'Y' 'N'
	 */
	private function _selectPayinfoWhereSql($uid,$item_id,$pay_type,$pay_mode,$is_confirmed,$enable,$trade_no=null){
		if(!empty($trade_no))$map['trade_no']	= $trade_no;
		if(!empty($uid))$map['user_id']			= $uid;
		if(!empty($item_id))$map['item_id']		= $item_id;
		if(!empty($pay_type))$map['pay_type']	= $pay_type;
		if(!empty($pay_mode))$map['service']	= $pay_mode;
		if(in_array($enable,array('Y','N')))$map['enable']	= $enable;
		if($is_confirmed=='all'){
		}else {
			if($is_confirmed=='Y')$map['is_confirmed']	= 'Y';
			if($is_confirmed=='N')$map['is_confirmed']	= 'N';
		}
		return $map;
	}
	
	/**
	 * 对应支付项与支付记录进行确认。
	 */
	public function doConfrimPay($item_id,$pay_type){
		$map['item_id']		= $item_id;
		$map['pay_type']	= $pay_type;
		$map['enable']	= 'Y';
		$map['is_confirmed']	= 'N';
		$data['is_confirmed']	= 'Y';
		$no = model('Pay')->where($map)->save($data);
		return $no;
	}
	
	/**
	 * 记录支付纪录。对应支付项的验证再次访法调用前验证。该方法只验证支付商是否正确。
	 * 			注：对于支付金额不作判断。以便记录所有的支付纪录。
	 * 验证项：	1。pay_type是否正确
	 * 			2。支付提供商是否正确。
	 * 
	 * @param array $ary_payinfo
	 * 					数据格式：$ary_payinfo=array(	'trade_no'=>'支付提供商生成的交易ID号'
	 * 													,'pay_type'=>'支付类型：对应数据字典-付款类型' 
	 * 													,'item_id'=>'对应订单ID或冲值纪录ID'
	 * 													,'total_fee'=>'支付金额'
	 * 													,'service'=>'支付提供商xxypay tenpay alipay'
	 * 													,'return_info'=>'支付服务提供商，返回的交易处理结果数据。序列化后的值'
	 *  												,'paytime'=>'支付服务提供商，返回的支付时间 如果不存在则为空'
	 *  												,'uid'=>'对应用户ID'
	 *  												,'sub_pay_type'=>'详细说明付款类型：现对应数据字典charge'
	 * 												);
	 */
	public function addPayInfo($ary_payinfo){
		$result['status'] 	= -1;
		$result['msg'] 		= '数据有误！';
		$paydict = service('Dict')->getAllDirectSubDicts('pay','code');
		if(!in_array($ary_payinfo['pay_type'],$paydict)){
			$result['msg'] 		= '支付类型错误！';
			return $result;
		}
		$payproviderdict = service('Dict')->getAllDirectSubDicts('payprovider','code');
		if(!in_array($ary_payinfo['service'],$payproviderdict)){
			$result['msg'] 		= '支付商错误！';
			return $result;
		}
		
		//如果为xxypay则需自定义交易编号 防止唯一性录入数据失败
		if($ary_payinfo['service']!='alipay'&&$ary_payinfo['service']!='tenpay')
			$ary_payinfo['trade_no']=time().$ary_payinfo['item_id'];
			
		$id = model('Pay')->addPayInfo($ary_payinfo['uid'],$ary_payinfo['trade_no'],$ary_payinfo['pay_type'],$ary_payinfo['item_id']
										,$ary_payinfo['total_fee'],$ary_payinfo['service']
										,$ary_payinfo['return_info'],$ary_payinfo['paytime'],$ary_payinfo['sub_pay_type']);
		if($id){
			$result['status'] 	= 1;
			$result['msg'] 		= '支付记录录入成功！';
		}else{
			$result['status'] 	= 0;
			$result['msg'] 		= '支付记录录入失败！';
		}
		return $result;
	}
	
	/**
	 * 当前用户删除订单支付数据,并将优惠券支付的优惠券设置为可用.
	 * @param unknown_type $order_id
	 */
	function delete4UserByOid($order_id){
		$paylist = $this->selectItemPay($order_id,'pay_order','Y','Y');
		//$shelfids = getSubByKey($shelfids, "shelf_id");
		foreach($paylist as $vo){
			if($_SESSION['mid']==$vo['user_id']){
				$pids[]=$vo['id'];
				if('couponpay'==$vo['service'])$passcodes[]=$vo['item_id'];
			}
		}
		if(!empty($pids))M('Pay')->where(array('id'=>array('in',$pids)))->save(array('enable'=>'N'));
		if(!empty($passcodes))M('CashcouponCode')->where(array('passcode'=>array('in',$passcodes)))->save(array('is_used'=>'N'));
	}
	//服务初始化
	public function init($data = '') {
	}
	
	
	//运行服务，系统服务自动运行
	public function run() {
	}
}
?>